#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

//一、
//引用：给变量起别名
//语法： 数据类型 & 别名 = 原名
 

//int main()
//{
//	int a = 10;
//	int& b = a;
//	cout << "a = " << a << endl;
//	cout << "b = " << b << endl;
//	b = 100;
//	cout << "a = " << a << endl;
//	cout << "b = " << b << endl;
//
//	system("pause");
//	return 0;
//	
//}

//二、
//注意事项
// 1.引用必须初始化
// 2.引用一旦初始化后，就不可以更改，初始化后等号更改只是赋值
//int main()
//{
//	int a = 10;
//	int c = 20;
//	int& b = a;
//	//int& b = c; //会报错，不能运行
//	b = c;  //赋值操作
//	cout << a << endl;
//	cout << b << endl;
//	cout << c << endl;
//}



//三、
////引用做函数参数
//
////交换函数
//
////值传递
//void Swap01(int a, int b)
//{
//	int tmp = a;
//	a = b;
//	b = tmp;
//}
//
////地址传递
//void Swap02(int* a, int* b)
//{
//	int tmp = *a;
//	*a = *b;
//	*b = tmp;
//}
//
////引用传递(和值传递的区别仅有函数参数需要加&)
//void Swap03(int& a, int& b)
//{
//	int tmp = a;
//	a = b;
//	b = tmp;
//}
//
//int main()
//{
//	int a = 10, b = 20; 
//	int c = 30, d = 40;
//	int e = 50, f = 60;
//	Swap01(a, b);
//	Swap02(&c, &d);
//	Swap03(e, f);
//	cout << a << " " << b << endl;
//	cout << c << " " << d << endl;
//	cout << e << " " << f << endl;
//}



////四、
////引用做函数返回值
//
////1.注意不要返回局部变量引用
//int& test01()
//{
//	int a = 10;
//	return a;
//}
//
////2.函数的调用可以作为左值
//int& test02()
//{
//	static int a = 10; //静态变量，放在全局区,全局区的内存程序运行结束时，系统自动释放
//	return a;
//}
//int main()
//{
//	int& ref01 = test01();
//	cout << "ref01=" << ref01 << endl; //结果为乱码(局部变量放在栈区，已经释放)
//	
//	int& ref02 = test02();
//	cout << "ref02=" << ref02 << endl; //结果为10
//
//	//作为左值
//	test02() = 20; //test02()就是a, ref02是a的别名，故此结果为20
//	cout << "ref02=" << ref02 << endl; //结果为20
//}




////五、
////引用的本质（引用的本质在cpp内部实现是一个指针常量 int* const ref = &a）
//int main()
//{
//	int a = 10;
//	int& ref = a; // int* const ref = &a  指针的指向不能改变，值可以改变
//	ref = 20;  //  *ref = 20;
//}



//六、
//常量引用(主要用来修饰形参，防止误操作, const int &a)
//int main()
//{
//	int a = 10;
//	//int& ref = 10;//此代码会报错，引用必须引用合法的内存空间，10在常量区
//	//加上const后，编译器自动修改为 int temp = 10; const int& ref = temp;
//	const int& ref = 10; //此代码正确
//	
//}

void showValue(const int& val)
{
	//val = 1000; //const修饰形式参数后就不能改变
	cout << "val =" << val << endl;
}
int main()
{
	int a = 100;
	showValue(a);
	cout << "a = " << a << endl;
}